<h1 style="text-align: center;">串口调试助手帮助文件</h1>

<h2>文件</h2>
<ul>
  <li><b>保存原始数据</b>：将自上一次清空窗口后收到的原始数据以二进制流形式保存</li>
  <li><b>打开原始数据</b>：将选择的文件中以二进制流的形式读入程序并进行解析</li>
  <li><b>保存显示数据</b>：将数据显示区中的内容以文本形式保存。该选项所见即所得，不可见字符会被抛弃，时间戳等修饰内容也会被保存。</li>
  <li><b>保存曲线数据</b>：将绘图器收到的数据保存为excel、csv、txt文件。（若要用本软件重新打开曲线数据，请选择“保存为原始数据”）</li>
  <li><b>保存曲线图片</b>：将绘图曲线保存为图片。图片的尺寸由当前窗口大小决定。图像的质量顺序由高到底通常为pdf > bmp > jpg = png</li>
  <li><b>发送文件</b>：将选择的文件以二进制流的形式从串口发送出去</li>
</ul>

<h2>功能</h2>
<ul>
  <li><b>多字符串</b>：发送的数据均会记录下来供重复使用。</li>
  <li><b>STM32-ISP</b>：实现STM32F1和F4系列的芯片的一键下载功能。该功能最好依赖自动下载电路，或者使用软件方法使单片机进入ISP模式
  <pre style="background-color: rgb(235, 235, 235);">
    //以下函数可用于跳转到ISP Bootloader模式
    void JumpToISP(void)
    {
        //根据芯片修改地址,参阅“芯片参考手册——Flash——系统存储区”部分
        //stm32f10x大中小型芯片均为0x1FFFF000
        //stm32f1系列的互联型芯片为0x1FFFB000
        //stm32f40x为0x1FFF0000
        //stm32f41x为0x1FFF0000

        #define ISPAddress 0x1FFFF000 

        //程序跳转不复位外设，建议对一些可能导致问题的外设进行反初始化DeInit，如SysTick。
        //看门狗一旦初始化不能被关闭，因此如果使用了看门狗，则在调用该函数前，必须先复位系统，并在初始化看门狗之前调用该函数。
        uint32_t ispJumpAddr;//ISP程序的跳转地址，既程序入口
        uint32_t ispSpValue;//ISP程序的SP初值，即栈指针
        void (*Jump_To_ISP)(void);//定义一个函数指针
    
        printf("\r\nJumping to ISP...");
        SysTick->CTRL=0x00;       //关闭计数器
        SysTick->VAL =0X00;       //清空计数器	
    
        if (((*(__IO uint32_t*)ISPAddress) & 0x2FFE0000 ) == 0x20000000)//SP->RAM,RAM => 0x20000000
        { 
            ispSpValue  = *(__IO uint32_t*)ISPAddress;
            ispJumpAddr = *(__IO uint32_t*)(ISPAddress+4);
    
            /* 初始化 Stack Pointer */
            __set_MSP(ispSpValue);
    
            /* Jump to isp */
            Jump_To_ISP = (void (*)(void))ispJumpAddr;
            Jump_To_ISP();
        }
    }
    </pre>
  </li>
  <li><b>全局弹出热键</b>：弹出主窗口，最小化后方便快速打开查看数据，默认值为Shift+Alt+C，可以被修改</li>
</ul>

<h2>设置</h2>
<ul>
  <li><b>串口设置</b>：对串口进行更丰富的设置</li>
  <li><b>编码规则</b>：选择软件内部使用的编码规则。这会影响中文显示效果</li>
  <li><b>回车样式</b>：选择win风格回车"\r\n"还是unix风格回车"\n"。这会影响回车效果</li>
  <li><b>关键字高亮</b>：开启/关闭数据显示区的关键字高亮功能，方便阅读。时间戳信息、字符串、注释等以及如下字符会被高亮: , ; { } = ( ) [ ] &lt; &gt;</li>
  <li><b>恢复默认设置</b>：软件支持保存部分设置，该按钮可以恢复所有默认设置。也可以在关闭软件后通过删除程序目录的ComAssistantConfig.ini文件达到同样目的。</li>
  <li><b>字体设置</b>：设置字体</li>
  <li><b>背景色设置</b>：设置背景色</li>
</ul>

<h2>数据可视化</h2>
<ul>
  <li><b>绘图器</b>：绘图器开关。<br>
    <ul><b>注意</b>：
        <li>横轴为绘图点的数量，纵轴为绘图点的值，如要求数据点之间具有相同的时间间隔，请自行控制下位机的发送时间间隔。</li>
        <li>为了追求简单易用，绘图协议默认不带数据校验，请勿过度相信数据正确性，尤其是波特率较高的情况下数据更容易出错，建议波特率不高于115200。</li>
    </ul>
    </li>
  <li><b>线型</b>：支持线图、点线图、点图三种风格</li>
  <li><b>数值显示器</b>：数值显示开关。与绘图器共用Ascii协议，不支持Float协议</li>
  <li><b>协议类型</b>：绘图器支持两种简单的协议类型，均为单精度浮点型。<br>
    <ul>
      <li>
        <b>Ascii协议规则为</b>：
        <pre style="background-color: rgb(235, 235, 235);">
        printf("{:%f,%f,%f}\r\n", data1, data2, data3);
        </pre>
        表示同一时刻，3条曲线的数据。{和:之间可以添加一些自定义数据，比如发送次数统计cnt++，但是不能再次添加:和{等容易引起歧义的符号。曲线数量不能超过15个。
      </li><br>
      <li>
        <b>带和校验的Ascii协议规则为</b>：
        <pre style="background-color: rgb(235, 235, 235);">
        data1 = (int)(data1*100)/100.0;
        data2 = (int)(data2*100)/100.0;
        sumCheck = (int)((data1 + data1)*100)/100.0;
        printf("{:%.2f,%.2f,%.2f}\r\n", (int)(data1*100)/100.0, data2, sumCheck);
        </pre>
        曲线的最后一个数据为校验和。以{:1.2,1.3,1.4,3.9}为例，绘图器若发现(1.2+1.3+1.4)-3.9小于10^-9成立，则认为校验通过，否则数据丢弃。<br>
        浮点计算有计算误差，请务必注意精度，如统一使用%.2f，并通过缩放取整来作数据截断。
      </li><br>
      <li>
        <b>Float协议规则为</b>：直接将float类型数据按小端顺序拆成4个字节依次发送，并以0x00, 0x00, 0x80, 0x7F四个字节作为一组数据的结尾，其中第一个数据表示第一条曲线，依次类推，曲线数量不能超过15个。
        <pre style="background-color: rgb(235, 235, 235);">
        //float转byte宏
        #define BYTE0(dwTemp)       (*(char *)(&dwTemp))
        #define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))
        #define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
        #define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))
        //发送函数
        void SendCurve(float data1, float data2)
        {
          u8 dataBuff[4+4+4];
          u8 cnt = 0;
          dataBuff[cnt++]=BYTE0(data1); //第一个变量
          dataBuff[cnt++]=BYTE1(data1);
          dataBuff[cnt++]=BYTE2(data1);
          dataBuff[cnt++]=BYTE3(data1);
          dataBuff[cnt++]=BYTE0(data2); //第二个变量
          dataBuff[cnt++]=BYTE1(data2);
          dataBuff[cnt++]=BYTE2(data2);
          dataBuff[cnt++]=BYTE3(data2);
          dataBuff[cnt++]=0x00; //结束标志
          dataBuff[cnt++]=0x00;
          dataBuff[cnt++]=0x80;
          dataBuff[cnt++]=0x7F;

          u8 size = cnt;
          for(int i = 0; i &lt; cnt; i++){
            printf("%c",dataBuff[i]);
          }
        }
        </pre>
      </li><br>
      <li>
        <b>带和校验的Float协议规则为</b>：同样是最后一个数据作为和校验 <br>
        <pre style="background-color: rgb(235, 235, 235);">
        //float转byte宏
        #define BYTE0(dwTemp)       (*(char *)(&dwTemp))
        #define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))
        #define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
        #define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))
        //发送函数
        void SendCurve(float data1, float data2)
        {
          u8 dataBuff[4+4+4+4];
          u8 cnt = 0;
          float sumCheck = data1 + data2;
          dataBuff[cnt++]=BYTE0(data1); //第一个变量
          dataBuff[cnt++]=BYTE1(data1);
          dataBuff[cnt++]=BYTE2(data1);
          dataBuff[cnt++]=BYTE3(data1);
          dataBuff[cnt++]=BYTE0(data2); //第二个变量
          dataBuff[cnt++]=BYTE1(data2);
          dataBuff[cnt++]=BYTE2(data2);
          dataBuff[cnt++]=BYTE3(data2);
          dataBuff[cnt++]=BYTE0(sumCheck); //和校验
          dataBuff[cnt++]=BYTE1(sumCheck);
          dataBuff[cnt++]=BYTE2(sumCheck);
          dataBuff[cnt++]=BYTE3(sumCheck);
          dataBuff[cnt++]=0x00; //结束标志
          dataBuff[cnt++]=0x00;
          dataBuff[cnt++]=0x80;
          dataBuff[cnt++]=0x7F;

          u8 size = cnt;
          for(int i = 0; i &lt; cnt; i++){
            printf("%c",dataBuff[i]);
          }
        }
        </pre>
      </li>
    </ul>
  </li>
  <li><b>绘图测试</b>：勾选后软件会生成不同波形数据并发送到串口，将TX和RX短接后，软件可以显示收到的数据</li>
</ul>

<h2>操作指导</h2>
<ul>
  <li>选中曲线时可以：右键删除、隐藏选中曲线，以及坐标跟随</li>
  <li>右键图例可以修改图例显示位置</li>
  <li>选中轴时可以对选中的轴进行缩放</li>
  <li>双击曲线名称可以修改曲线名称</li>
  <li>双击轴标题可以修改轴标题名称</li>
  <li>“数据显示区”、“多字符串”、“绘图器”、“数值显示器”之间均可以通过拖动自行调整大小</li>
</ul>

<h2>快捷键</h2>
<ul>
  <li><code style="background-color: rgb(235, 235, 235);">Shift+Alt+C </code>全局弹出快捷键（支持自定义）</li>
  <li><code style="background-color: rgb(235, 235, 235);">Ctrl+Enter </code>发送按钮</li>
  <li><code style="background-color: rgb(235, 235, 235);">Ctrl+Delete</code>清空按钮</li>
  <li><code style="background-color: rgb(235, 235, 235);">Ctrl+S</code>保存原始数据</li>
  <li><code style="background-color: rgb(235, 235, 235);">Ctrl+O</code>打开原始数据</li>
  <li><code style="background-color: rgb(235, 235, 235);">F1</code>使用教程</li>
  <li><code style="background-color: rgb(235, 235, 235);">F2</code>使用统计</li>
  <li><code style="background-color: rgb(235, 235, 235);">F3</code>检查更新</li>
  <li><code style="background-color: rgb(235, 235, 235);">F4</code>关于</li>
  <li><code style="background-color: rgb(235, 235, 235);">F5</code>刷新串口按钮</li>
</ul>

<h2>注意</h2>
<ul>
  <li>数据显示区最多只显示最近大约4096字节。更早的数据没有丢失，暂停接收后向上滑动滚轮即可加载</li>
  <li>在接收大量数据时，建议将数据显示区缩至最小以减少显示数量，可提高运行流畅度</li>
</ul>

<h2>隐私声明</h2>
<p>
本软件可能会收集部分使用统计信息上传至服务器，为了区分设备，需要上传网卡MAC地址作为唯一标识。若您无法接受，可使用防火墙阻拦本软件的网络请求，或者请勿使用本软件。
</p>

<br><br>
<p style="text-align: center;">
  免责声明：作者不对本软件造成的任何后果承担任何责任 <br>
  <a style="text-decoration: none;"  href="https://github.com/inhowe/ComAssistant">
    © 2020-现在 INHOWE
  </a>
</p>

<p></p>
